在男性前列腺癌數據中,有個feature叫PROSSUG,代表著這個患者是否接受過前列腺的手術,
這個feature很難說是病人患前列腺癌的‘原因’(患心髒病的原因是接受過心臟手術?),
而更像是一個標記,當然與病人是否患有前列腺癌極度相關。
依靠著這樣的feature訓練出來的模型,肯定能夠得到很好的預測結果,
但對實際了解男性前列腺癌的成因,沒有一點幫助。存在和利用這種倒‘因’為‘果’的feature的現象,叫數據競賽中的Data Leakage。
數據泄露最常見的例子之一就是把未來資料的特徵當成訓練集,
舉個例子:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, shuffle=True)
這個語法很多人都用過吧,
沒看過的這邊簡單說一下,該語法的作用就是將資料分成兩堆,
一堆用作訓練、一堆拿來檢查模型的預測效果
為什麼該語法會有問題呢? 問題出在這裡:
......, shuffle=True)
沒錯,他分資料的方式是把資料打亂抽選,這樣會發生甚麼事呢?
要知道股市資料是典型的序列資料(Sequential data)
即前面與後面的資料有極強的關聯性,隨機抽選的話會直接打斷該層連結
然而你會發現用這樣訓練出來的模型準確率異常高
為什麼呢,很簡單,因為你把未來的特徵也加進去了:
試問假如今天我要用9月資料預測10月台積電價格,
結果你給的預測理由是:從10月的台泥開盤價看出來的,
為什麼會有這篇呢?
簡單來說有個人試了半天預測模型,結果發現準確率都在50%左右
翻了半天論文發現大家都差不多,
論文的模型準確率在60%以上都算是優秀了,
Debug了半天後發現我參考的論文有這句:
It is important to note that the cases are not exactly consecutive trading days because we split our dataset randomly by shuffling.
呵呵,這個故事告訴我們論文來源要慎選,不然心態容易崩
From Unknown (我真的找不到這張的來源......)